﻿// $Id: PredicateRule.cs 10 2008-02-29 15:58:02Z mcartoixa $

/* ***************************************************************************
 *                                                                           *
 * Copyright © 2007 NourY Solutions                                          *
 *                                                                           *
 * This file is part of DataRules.                                           *
 *                                                                           *
 * DataRules is free software; you can redistribute it and/or modify it      *
 * under the terms of the GNU Lesser General Public License as published     *
 * by the Free Software Foundation; either version 3 of the License, or      *
 * (at your option) any later version.                                       *
 *                                                                           *
 * DataRules is distributed in the hope that it will be useful, but          *
 * WITHOUT ANY WARRANTY; without even the implied warranty of                *
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU          *
 * Lesser General Public License for more details.                           *
 *                                                                           *
 * You should have received a copy of the GNU Lesser General Public          *
 * License along with this program.  If not, see                             *
 * <http://www.gnu.org/licenses/lgpl.html>.                                  *
 *                                                                           *
 *************************************************************************** */

/*! \file
 * \brief Definition of \c Salamanca.DataRules.PredicateRule.
 *
 * \author $Author: mcartoixa $
 * \date $Date: 2008-02-29 16:58:02 +0100 (ven., 29 févr. 2008) $
 * \version $Revision: 10 $
 */

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.Text;

namespace Salamanca.DataRules
{



    ///////////////////////////////////////////////////////////////////////////
    ///
    /// <summary>Business rule based on a <see cref="Predicate{T}" />.</summary>
    /// <typeparam name="T">The type parameter used for the <see cref="Predicate{T}" />.</typeparam>
    ///
    ///////////////////////////////////////////////////////////////////////////

    public class PredicateRule<T>:
        Rule
    {

        /// <summary>Constructor.</summary>
        /// <param name="description">The description of the rule.</param>
        /// <param name="rulePredicate">The predicate used to validate the rule.</param>
        /// <exception cref="ArgumentNullException">
        ///   <para><paramref name="description" /> is <c>null</c>.</para>
        /// </exception>
        public PredicateRule(string description, Predicate<T> rulePredicate):
            this(string.Empty, description, rulePredicate)
        {
        }

        /// <summary>Constructor.</summary>
        /// <param name="propertyName">The name of the property which the rule applies to. For a general rule, this can be the empty string (<c>""</c>).</param>
        /// <param name="description">The description of the rule.</param>
        /// <param name="rulePredicate">The predicate used to validate the rule.</param>
        /// <exception cref="ArgumentNullException">
        ///   <para><paramref name="propertyName" /> is <c>null</c>.</para>
        ///   <para><paramref name="description" /> is <c>null</c>.</para>
        /// </exception>
        public PredicateRule(string propertyName, string description, Predicate<T> rulePredicate):
            base(propertyName, description)
        {
            _RulePredicate=rulePredicate;
        }

        /// <summary>Validates the rule on the specified target.</summary>
        /// <param name="target">The instance against which the rule is validated.</param>
        /// <returns><c>true</c> if the instance is valid for the rule, <c>false</c> if not.</returns>
        protected override bool DoValidate(object target)
        {
            return _RulePredicate((T)target);
        }

        /// <summary>The predicate used to validate the rule.</summary>
        private Predicate<T> _RulePredicate;
    }
}
